perm filename HENET.H[11,HE] blob
sn#690538 filedate 1982-12-08 generic text, type T, neo UTF8
/* enet.h CMU 1/18/80 */
/*
* Ethernet definitions needed for user processes
*
**********************************************************************
* HISTORY
* 10-Aug-82 Mike Accetta (mja) at Carnegie-Mellon University
* Added EIOCMBIS and EIOCMBIC definitions, and new ENHOLDSIG mode
* bit and ENPRIVMODES defintions (V3.05e).
*
* 15-Jan-82 Mike Accetta (mja) at Carnegie-Mellon University
* Changed ENPACKETSIZE to 560 from 300 and ENMAXPACKETS to 50 from 100
* (V3.04a).
*
* 15-Jan-82 Mike Accetta (mja) at Carnegie-Mellon University
* Expanded to a maximum of 32 ethernet devices from previous maximum of
* 16 (V3.03e).
*
* 30-Nov-81 Mike Accetta (mja) at Carnegie-Mellon University
* Added SigPid field to open descriptor (V3.03d).
*
* 24-Nov-81 Mike Accetta (mja) at Carnegie-Mellon University
* Added counts for queued and dropped packets on input and sent and
* dropped packets on output to the state structure (V3.03c).
*
* 07-Oct-81 Mike Accetta (mja) at Carnegie-Mellon University
* Substantially rewritten for 4.1BSD and incorporating most ideas
* from previous changes by Bob Fitzgerald and Jeff Mogul (V3.03a).
*
* 12-Aug-81 Bob Fitzgerald (rpf) at Carnegie-Mellon University
* Added DEFWAITING, MINSCAVENGE, EIOCSETW, EIOCFLSH, EIOCSTAT,
* struct eniosb, QueueShort and QueueLong with associated
* constants. Modified structs OpenDescriptor and QueueElt.
* Following Jeff Mogul@Stanford, split packets into separate
* free queues for transmitter and receiver so as to map each
* packet onto the unibus only once. Converted State element
* of OpenDescriptor to enumeration and renamed it RecvState.
*
* 23-Apr-81 Mike Accetta (mja)) at Carnegie-Mellon University
* Moved some structure declarations from enet.c to make them
* avialable to pstat (V2.00g).
*
* 03-Jul-80 Mike Accetta (mja) at Carnegie-Mellon University
* Added EIOCENBS and EIOCINHS definitions (V1.07f).
*
* 27-Feb-80 Mike Accetta (mja) at Carnegie-Mellon University
* Added EIOCGETP, EIOCSETP, EIOCSETF, HIPRIDEV, and HIPRI
* definitions (V1.05a).
*
* 22-Feb-80 Rick Rashid (rfr) at Carnegie-Mellon University
* Rewritten for multiple simultaneous opens with filters (V1.05).
*
* 18-Jan-80 Mike Accetta (mja) at Carnegie-Mellon University
* Created (V1.00).
*
**********************************************************************
*/
#ifdef KERNEL
/* tunable constants */
#define ENMAXOPENS 32 /* # of enet devices */
#define ENINDEXBITS 5 /* [ LOG2(ENMAXOPENS) ] */
#define ENINDEXMASK (ENMAXOPENS-1) /* mask bits for minor device index */
#define ENHIPRIDEV 28 /* lowest high priority device */
#define ENHIPRI 128 /* high priority priority */
#define ENMAXPRI 255 /* maximum high priority priority */
#define ENUNIT(dev) (enUnit[(u_char)minor(dev)>>ENINDEXBITS]) /* macro */
/* to extract ethernet unit number */
/* from device number (used as the */
/* index into the enState[] table); */
/* this goes indirect through */
/* enUnit[] so that user software is */
/* insulated from the physical unit */
/* number */
#define ENINDEX(dev) (minor(dev)&ENINDEXMASK) /* macro to extract logical */
/* device index from device number */
/* (used as the index into the */
/* AllDescriptors table for the */
/* unit) */
#define ENPACKETSIZE 560 /* max size of packet in short words */
#define ENMAXWAITING 8 /* maximum number of packets */
/* which can be queued at one time */
/* for an open enet file (max 256) */
#define ENDEFWAITING 2 /* default number of packets */
/* which can be queued at one */
/* time for an open enet file */
#define ENPACKETS 50 /* number of preallocated packets */
/* available for sending and */
/* receiving (these should be allocated */
/* dynamically once the system makes */
/* this more feasible) */
#define ENXPACKETS 3 /* maximum number of packets from free */
/* queue to be allocated for transmitting */
#define ENMINSCAVENGE 4 /* minimum number of packets */
/* guaranteed to be freed by */
/* scavenging */
#define ENUBAALLOCSIZE ((2*ENPACKETSIZE)+NBPG-1)/* size of packet mapped */
/* onto UNIBUS (extended by one page */
/* to allow for remapping at */
/* arbitrary byte offsets) */
#define ENADDR ((struct enreg *)(ui->ui_addr)) /* macro to address the */
/* device registers of the current */
/* ethernet unit */
/*
* Privileged mode bits
*/
#define ENKERNEL (0x8000) /* flag bit to indicate kernel mode */
/* requests */
/*
* The following definitions are meant to clean up
* C language syntax a bit.
*/
typedef enum {false, true} boolean;
#define TRUE ((int)true)
#define FALSE ((int)false)
#define endcase break;
/*
* The ethernet packet structure.
*
*/
struct enPacket
{
struct Queue enP_Link; /* queue pointers */
int (*enP_Func)(); /* finish processing function */
u_short *enP_Data; /* pointer to start of packet */
short enP_WordCount; /* 16 bit words in Data */
u_short enP_RefCount; /* # of outstanding references to */
/* this packet */
};
#define enP_F enP_Link.F
#define enP_B enP_Link.B
/*
* Ethernet queue header
*/
struct enQueue
{
struct Queue enQ_Head; /* queue header and trailer pointers */
u_short enQ_NumQueued; /* number of elements in queue */
};
#define enQ_F enQ_Head.F
#define enQ_B enQ_Head.B
/*
* Wait queue header
*/
struct enWaitQueue
{
struct enPacket *enWQ_Packets[ENMAXWAITING];/* pointers to queued packets */
char enWQ_Head; /* index into Packets (for dequeue) */
char enWQ_Tail; /* index into Packets (for enqueue) */
u_char enWQ_NumQueued; /* current queue size */
u_char enWQ_MaxWaiting; /* threshold for additions */
};
#define enNextWaitQueueIndex(idx) \
if (++(idx) >= ENMAXWAITING) (idx) = 0
#define enPrevWaitQueueIndex(idx) \
if (--(idx) < 0) (idx) = (ENMAXWAITING-1)
#endif
#define ENMAXFILTERS 40 /* maximum filter short words */
/*
* filter structure for SETF
*/
struct enfilter
{
u_char enf_Priority; /* priority of filter (obsolete */
/* for normal priority filters) */
u_char enf_FilterLen; /* length of filter command list */
u_short enf_Filter[ENMAXFILTERS]; /* the filter command list */
};
#ifdef KERNEL
/*
* States of receive side of open enet file.
*/
enum enStates {ENRECVIDLE, ENRECVTIMING, ENRECVTIMEDOUT};
struct enOpenDescriptor
{
struct Queue enOD_Link; /* Linked list of OpenDescriptors */
struct enWaitQueue enOD_Waiting; /* fixed Queue of waiting packets */
union
{
struct proc *enODun_SigProc; /* Process to signal (user mode) */
int (*enODun_SigFunc)();/* Function to call (kernel mode) */
} enOD_un;
short enOD_SigPid; /* Process ID of process to signal */
short enOD_SigNumb; /* Signal number for input packet */
/* notification (if >= NSIG then */
/* kernel mode acces) */
short enOD_Timeout; /* Length of time to wait for packet */
struct enfilter enOD_OpenFilter; /* Packet filter */
enum enStates enOD_RecvState; /* see enStates enumeration (above) */
short enOD_Flag; /* Kernel and user mode option bits */
};
#define enOD_SigProc enOD_un.enODun_SigProc
#define enOD_SigFunc enOD_un.enODun_SigFunc
/*
* State descriptor for each enet device
*/
struct enState
{
long ens_Rcnt; /* input packets queued since */
/* system startup */
long ens_Xcnt; /* output packets sent since */
/* system startup */
long ens_Rdrops; /* input packets dropped since */
/* system startup */
long ens_Xdrops; /* output packets dropped since */
/* system startup */
u_short ens_Rerrors; /* input error count since system
/* startup */
u_short ens_Xerrors; /* output error count since system */
/* startup */
u_short ens_Rand; /* pseudo random number for */
/* transmit backoff */
u_short ens_XmitqMax; /* minimum transmit freeq size */
u_short ens_Mask; /* mask for transmit backoff */
u_char ens_OpenFlag[ENMAXOPENS];/* (enopf[i] != 0) iff device */
/* is open */
struct enOpenDescriptor /* state array for open enet */
ens_AllDescriptors[ENMAXOPENS]; /* files */
struct enQueue /* queue of active open */
ens_Desq; /* file descriptors */
struct enQueue /* queue of packets waiting to */
ens_Xmitq; /* be transmitted */
struct enPacket /* packet currently being */
*ens_XP; /* transmitted (NULL ==> inactive) */
struct enPacket /* packet currently being received */
*ens_RP; /* (NULL ==> inactive) */
int ens_Xinfo; /* transmit UBA resources */
int ens_Rinfo; /* receive UBA resources */
};
#define enRcnt (enStatep->ens_Rcnt)
#define enXcnt (enStatep->ens_Xcnt)
#define enRdrops (enStatep->ens_Rdrops)
#define enXdrops (enStatep->ens_Xdrops)
#define enRerrors (enStatep->ens_Rerrors)
#define enXerrors (enStatep->ens_Xerrors)
#define enRand (enStatep->ens_Rand)
#define enXmitqMax (enStatep->ens_XmitqMax)
#define enMask (enStatep->ens_Mask)
#define enOpenFlag (enStatep->ens_OpenFlag)
#define enAllDescriptors (enStatep->ens_AllDescriptors)
#define enDesq (enStatep->ens_Desq)
#define enCurOpens (enStatep->ens_Desq.enQ_NumQueued)
#define enXmitq (enStatep->ens_Xmitq)
#define enXP (enStatep->ens_XP)
#define enRP (enStatep->ens_RP)
#define enXinfo (enStatep->ens_Xinfo)
#define enRinfo (enStatep->ens_Rinfo)
/*
* Structure of device register
*/
struct enreg
{
short enxwc;
short enxba;
short enxcsr;
short enxdly;
short enrwc;
short enrba;
short enrcsr;
short enaddr;
};
/* status bits in csr */
#define ENCSR_ERR 0100000
#define ENCSR_IE 0100
#define ENCSR_PROM 02 /* promiscuous mode (currently unused) */
#define ENCSR_GO 01
#endif
/* set/get parameters, set filter ioctl commands */
#define EIOCSETP (('E'<<8)|100)
#define EIOCGETP (('E'<<8)|101)
#define EIOCSETF (('E'<<8)|102)
#define EIOCENBS (('E'<<8)|103)
#define EIOCINHS (('E'<<8)|104)
#define EIOCSETW (('E'<<8)|105)
#define EIOCFLUSH (('E'<<8)|106)
#define EIOCALLOCP (('E'<<8)|107)
#define EIOCDEALLOCP (('E'<<8)|108)
#define EIOCMBIS (('E'<<8)|109)
#define EIOCMBIC (('E'<<8)|110)
/*
* Bits in mode word modified by EIOCMBIS and EIOCMBIC.
*/
#define ENHOLDSIG (0x0001) /* don't disable signal after sending */
#define ENPRIVMODES (~(ENHOLDSIG))
/*
* We now allow specification of up to MAXFILTERS (short) words of a filter
* command list to be applied to incoming packets to determine if
* those packets should be given to a particular open ethernet file.
*
* Each open enet file specifies the filter command list via iocontrl.
* Each filter command list specifies a sequences of actions which leave a
* boolean value on the top of an internal stack. Each word of the
* command list specifies an action from the set {PUSHLIT, PUSHZERO,
* PUSHWORD+N} which respectively push the next word of the stack, zero,
* or word N of the incoming packet on the stack, and a binary operator
* from the set {EQ, LT, LE, GT, GE, AND, OR, XOR} which operates on the
* top two elements of the stack and replaces them with its result. The
* special action NOPUSH and the special operator NOP can be used to only
* perform the binary operation or to only push a value on the stack.
*
* If the final value of the filter operation is true, then the packet is
* accepted for the open file which specified the filter.
*
*/
/* these must sum to 16! */
#define ENF_NBPA 10 /* # bits / action */
#define ENF_NBPO 6 /* # bits / operator */
/* binary operators */
#define ENF_NOP (0<<ENF_NBPA)
#define ENF_EQ (1<<ENF_NBPA)
#define ENF_LT (2<<ENF_NBPA)
#define ENF_LE (3<<ENF_NBPA)
#define ENF_GT (4<<ENF_NBPA)
#define ENF_GE (5<<ENF_NBPA)
#define ENF_AND (6<<ENF_NBPA)
#define ENF_OR (7<<ENF_NBPA)
#define ENF_XOR (8<<ENF_NBPA)
/* stack actions */
#define ENF_NOPUSH 0
#define ENF_PUSHLIT 1
#define ENF_PUSHZERO 2
#define ENF_PUSHWORD 16
/*
* parameter buffer structure for GETP and SETP
*/
struct eniocb
{
u_char en_addr; /* ethernet address (RO) */
u_char en_maxfilters; /* max filter words available (RO) */
u_char en_maxwaiting; /* max queued input packets (RO) */
u_char en_maxpriority; /* max filter priority for this file (RO) */
short en_rtout; /* receive timeout in (jiffies) (RW) */
short en_pad1; /* (unused; must be zero) */
};